/******************************************************************************
** 
** File name:	UTEST_01.c
**	
** Description:	RTOS Ver.3 Unit Tests. Basic RTOS Task services from
**				the task execution level (no interrupts).
**
** RTOS API Services to be checked:
**
**		- RTOS_DebugPrint()
**		- RTOS_DebugLog()
**
** Notes:	PASSED
**
*******************************************************************************
**
** Change history:
**	
** 10/01/2012 -AK- 	Introducing new unit test standard with RTOS resources
**					configuration moved to the dedicated source/header file
**
******************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>

#ifndef UTEST_01
#	error "UTEST_01 must be defined as -D$(Configuration) compiler option"
#endif

#include "UTEST_RES.h"

/******************************************************************************
**	UNIT TEST INTERRUPT FUNCTION[s]
******************************************************************************/

// N/A

/******************************************************************************
**	UNIT TEST TASK FUNCTION[s]
******************************************************************************/
/*
** RTOS Task #0 - Stack checking task
*/
RTOS_TASK_FUNC(tsk0)
{
	while(1) {}
}

/*
** RTOS Task #1
*/
RTOS_TASK_FUNC(tsk1)
{
	RTOS_U8_t			u8  = 0x33;
	RTOS_U16_t			u16 = 0xAA33;
	
	static RTOS_U8_t 	u8s = 0x33;
	static RTOS_U16_t 	u16s= 0xAA33;
	
	RTOS_U8_t *			a8 	= &u8s;
	RTOS_U16_t *		a16 = &u16s;
	
	RTOS_DebugPrint("\t[T1] Started");
	
	while(1)
	{
		RTOS_DebugPrint("Test of RTOS_DebugPrint(\"fmt_str\")")
		
		RTOS_DebugPrint("Absolute values");
		
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U8_t) val) val = 0x%4X",0x33)	;
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U16_t) val) val = 0x%4X",0xAA33);

		RTOS_StackCheck(tsk1);

		RTOS_DebugPrint("Static values");		
		
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U8_t) val) val = 0x%4X",u8s);
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U16_t) val) val = 0x%4X",u16s);

		RTOS_StackCheck(tsk1);
		
		RTOS_DebugPrint("Dynamic values");		
		
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U8_t) val) val = 0x%4X",u8);
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",(RTOS_U16_t) val) val = 0x%4X",u16);

		RTOS_StackCheck(tsk1);
		
		RTOS_DebugPrint("Values by reference");
		
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",*(RTOS_U8_t *) addr) val = 0x%4X",*a8);
		RTOS_DebugPrint("DebugPrint(\"fmt_str\",*(RTOS_U16_t *) sddr) val = 0x%4X",*a16);
		
		RTOS_StackCheck(tsk1);

		RTOS_DebugPrint("Multiply values (by value) starts from AA33 and increments every printed value");
		
		RTOS_DebugPrint(" 1x %4X", u16++);
		RTOS_DebugPrint(" 2x %4X %4X",u16++, u16++);
		RTOS_DebugPrint(" 3x %4X %4X %4X",u16++, u16++, u16++);
		RTOS_DebugPrint(" 4x %4X %4X %4X %4X",u16++, u16++, u16++, u16++);
		RTOS_DebugPrint(" 5x %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint(" 6x %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint(" 7x %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint(" 8x %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);

		RTOS_StackCheck(tsk1);
#if 0		
		RTOS_DebugPrint(" 9x %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("10x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("11x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("12x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("13x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("14x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("15x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		RTOS_DebugPrint("16x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++, u16++);
		
		RTOS_StackCheck(tsk1);
#endif		
		RTOS_DebugPrint("Multiply values (by address) starts from 0033 and increments every printed value");
		
		RTOS_DebugPrint(" 1x %4X", (*a8)++);
		RTOS_DebugPrint(" 2x %4X %4X",(*a8)++, (*a8)++);
		RTOS_DebugPrint(" 3x %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint(" 4x %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint(" 5x %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint(" 6x %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint(" 7x %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint(" 8x %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		
		RTOS_StackCheck(tsk1);
#if 0
		RTOS_DebugPrint(" 9x %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("10x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("11x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("12x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("13x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("14x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("15x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		RTOS_DebugPrint("16x %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X %4X",(*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++, (*a8)++);
		
		RTOS_StackCheck(tsk1);
#endif
		RTOS_DebugPrint("Suspending...");
		RTOS_TaskSuspend(&tsk1PID);
	}
}

/*
** RTOS Task #2 
*/
RTOS_TASK_FUNC(tsk2)
{
	while(1) {}
}

/*
** RTOS Task #3 
*/
RTOS_TASK_FUNC(tsk3)
{
	while(1) {}
}

